// 连通块中点的数量
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;           // n个点，m次操作
int p[N], sizep[N]; // p[]表示每个集合，size表示每个集合中点的数量
int find(int x)
{
    if (p[x] != x)
        p[x] = find(p[x]);
    return p[x];
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        p[i] = i;
        sizep[i] = 1; // 最开始每个集合都只有一个点
    }
    while (m--)
    {
        char op[5];
        int a, b;
        scanf("%s", op);
        if (op[0] == 'C')
        {
            scanf("%d%d", &a, &b);
            if (find(a) == find(b))
                continue;
            sizep[find(b)] += sizep[find(a)]; // 连接操作数量相加
            p[find(a)] = find(b);             // 连接操作
        }
        else if (op[1] == '1')
        {
            scanf("%d%d", &a, &b);
            if (find(a) == find(b)) // 两点在一个集合中
                puts("Yes");
            else
                puts("No");
        }
        else
        {
            scanf("%d", &a);
            printf("%d\n", sizep[find(a)]); // 输出集合大小
        }
    }
    return 0;
}